# -*- coding: utf-8 -*-
# @Time: 2021/8/21 23:21
# @Author: yuan hao
# @Remark: 视频管理model层
import time
from enum import Enum

from mxsoftpy import Model
from pydantic import constr, validator, conint

from model.public.base import MxBaseModel, MxUpdateBaseModel
from utils.parser.fields import check_ipv4, check_code_int


class VideoUpdateModel(MxUpdateBaseModel):
    """
    视频更新模型
    """
    name: constr(min_length=1, max_length=50)        # 视频名称
    server_ip: str                                   # 流媒体服务器ip，用于页面预览
    device_ip: str                                   # 设备ip
    url: str                                         # 设备url，存放rtsp协议获取视频帧时的url路径
    port: conint(ge=0, le=65535)                     # 端口
    username: str                                    # 登录用户名
    password: str                                    # 登录密码
    stream_code: str                                 # 码流code
    aisle: str                                       # 通道
    vendor: str = ''                                 # 供应商
    device_type_code: str                            # 设备类型code
    data_state: int                                  # 数据状态（是否启用 0：停用、1启用）
    desc: constr(min_length=1, max_length=200) = ''  # 备注

    # 校验是否为ipv4类型
    _check_ip = validator('server_ip', 'device_ip', allow_reuse=True)(check_ipv4)


class VideoDeleteModel(MxUpdateBaseModel):
    """
    视频删除模型
    """
    video_code: str                                   # 视频code
    delete_type: int                                  # 任务关联状态 1：关联 2：不关联
    plans: list = []                                  # 视频关联的计划列表
    tasks: list = []                                  # 视频关联的任务列表


class VideoModel(VideoUpdateModel, MxBaseModel):
    """
    视频模型
    """
    group_code: str                                  # 所属视频组code
    state: int = 1                                   # 状态 0：删除、1：在用

    running_error: str = ''                          # 当前视频所有的错误检测项目code，多个使用分号分割
    running_normal: str = ''                         # 当前视频所有的正常检测项目code，多个使用分号分割
    running_fail: str = ''                           # 当前视频所有的检测失败检测项目code，多个使用分号分割
    running_time: int = 0                            # 检测运行状态的时间（代码内部更新使用，无需定义str进行校验，直接使用时间戳）

    repair_state: int = 0                            # 待修状态，标记该视频是否待修 0：正常、1：待修
    repair_personnel: str = ''                       # 待修状态添加人，记录谁添加的此待修状态
    repair_time: int = 0                             # 待修状态添加时间

    # 校验ip是否符合ipv4格式
    _check_ip = validator('server_ip', 'device_ip', allow_reuse=True)(check_ipv4)


class VideoTestUpdateModel(MxUpdateBaseModel):
    """
    视频状态更新模型
    """
    running_error: str                     # 当前视频所有的错误检测项目code，多个使用分号分割
    running_normal: str                    # 当前视频所有的正常检测项目code，多个使用分号分割
    running_fail: str                      # 当前视频所有的检测失败检测项目code，多个使用分号分割
    running_time: int = int(time.time())   # 检测运行状态的时间（代码内部更新使用，无需定义str进行校验，直接使用时间戳）


class VideoRepairCreateModel(MxUpdateBaseModel):
    """
    待修库新增模型
    """
    repair_state: int = 1                # 待修状态，标记该视频是否待修 0：正常、1：待修
    repair_personnel: str                # 待修状态操作人，记录谁更新的此待修状态
    repair_time: int = int(time.time())  # 待修状态操作时间


class VideoRepairDeleteModel(MxUpdateBaseModel):
    """
    待修库删除模型
    """
    repair_state: int = 0  # 待修状态，标记该视频是否待修 0：正常、1：待修
    repair_time: int = int(time.time())  # 待修状态操作时间


class TestImageModel(MxBaseModel):
    """
    测试图片
    """
    test_code: str                                     # 测试CODE
    video_code: str                             # 视频code
    file_name: str                             # 图片文件名
    test_time: int = int(time.time())         # 检测时间


class PreviewModel(str, Enum):
    """
    任务状态模型
    """
    photo = '0'  # 未开始
    video = '1'  # 进行中

class VideoPreviewSelectModel(Model):
    """
    视频预览查询模型
    """
    video_code: str    # 视频code
    pre_code: PreviewModel = PreviewModel.photo.value  # 1 视频、2 图片
    task_code: str     # 任务code
